package models

import (
	"time"

	"gorm.io/gorm"
)

// 自定义类型：评分字段
type MovieRating float64

const (
	TERRIBLE  MovieRating = 1 //糟糕
	POOR      MovieRating = 2 //差
	OKAY      MovieRating = 3 //一般
	GOOD      MovieRating = 4 //良好
	EXCELLENT MovieRating = 5 //优秀
)

type Movie struct {
	ID        uint           `gorm:"primarykey" json:"id,omitempty"`
	CreatedAt time.Time      `json:"created_at,omitempty"`
	UpdatedAt time.Time      `json:"updated_at,omitempty"`
	DeletedAt gorm.DeletedAt `gorm:"index" json:"deleted_at,omitempty"`

	ImdbID       string      `gorm:"unique;not null" json:"imdb_id,omitempty" binding:"required"`
	Title        string      `gorm:"not null" json:"title,omitempty" binding:"required,min=2,max=500"` //标题
	PosterPath   string      `json:"poster_path,omitempty" binding:"required,url"`                     //封面海报的路径
	YouTubeID    string      `json:"youtube_id,omitempty" binding:"required"`                          //指向电影预告片的位置
	LikeCount    uint64      `gorm:"default=0" json:"like_count"`                                      //点赞
	AdminRating  MovieRating `gorm:"default=0" json:"admin_rating"`                                    //管理员给电影的评分
	Rating       MovieRating `gorm:"default=0" json:"rating"`                                          //电影总评分
	PlayCount    uint64      `gorm:"default=0" json:"play_count"`                                      //播放次数
	CollectCount uint64      `gorm:"default=0" json:"collect_count"`                                   //收藏次数
	//电影评论总数
	ReviewCount uint64 `gorm:"default=0" json:"review_count"`

	//电影评论--一对多
	ReviewList []MovieReview `gorm:"foreignKey:MovieId" json:"veview_list,omitempty"`
	// 声明多对多关系--电影的类型
	GenreList []Genre `gorm:"many2many:movie_genres" json:"genre_list,omitempty" binding:"min=1,required,dive"`

	//收藏该电影的用户--多对多
	CollectUserList []User `json:"collect_user_list,omitempty" gorm:"many2many:user_movie_collects;foreignKey:ID;joinForeignKey:MovieID;References:ID;joinReferences:UserID;"`

	//电影简介
	MovieSynopsis MovieSynopsis `gorm:"foreignKey:MovieId" json:"movie_synopsis,omitempty" binding:"required,max=500"`

	//电影内容--一对多(因为可以给电影分段，然后分段存储每一段的相关内容)
	MovieContentList []MovieContent `gorm:"foreignKey:MovieId" json:"movie_content_list,omitempty"`

	//用户观看电影时，向AI提问的问题中，拆解出来的关键字--多对多
	MovieQuestionKeywordList []MovieQuestionKeyword `gorm:"many2many:movie_question_keyword_correlations" json:"movie_question_keyword_list,omitempty"`
}

// 电影评论--从表
type MovieReview struct {
	ID        uint           `gorm:"primarykey" json:"id,omitempty"`
	CreatedAt time.Time      `json:"created_at,omitempty"`
	UpdatedAt time.Time      `json:"updated_at,omitempty"`
	DeletedAt gorm.DeletedAt `gorm:"index" json:"deleted_at,omitempty"`

	Review    string      `gorm:"not null" json:"review,omitempty" binding:"required"`       //评论内容
	Rating    MovieRating `gorm:"not null" json:"rating" binding:"required,oneof=1 2 3 4 5"` //用户给电影的评分
	LikeCount uint64      `gorm:"default=0" json:"like_count"`                               //评论的点赞数量

	MovieId uint `gorm:"not null" json:"movie_id,omitempty" binding:"required"` //评论的电影的id
	UserId  uint `gorm:"not null" json:"user_id,omitempty" binding:"required"`  //评论的用户的id
	//评论的电影
	Movie *Movie `gorm:"foreignKey:MovieId" json:"movie,omitempty"`
	//发表评论的用户
	User *User `gorm:"foreignKey:UserId" json:"user,omitempty"`
}

// 电影的类型（喜剧类等等）
type Genre struct {
	ID        uint   `gorm:"primarykey" json:"id,omitempty" binding:"required"`
	GenreName string `gorm:"unique;not null" json:"genre_name,omitempty" binding:"required"` //类型名称
	// 声明多对多关系
	MovieList []Movie `gorm:"many2many:movie_genres" json:"movie_list,omitempty"`
}

// 电影收藏表--关联表
type UserMovieCollect struct {
	MovieId uint `gorm:"primarykey" json:"movie_id,omitempty" binding:"required"` //电影id
	UserId  uint `gorm:"primarykey" json:"user_id,omitempty" binding:"required"`  //用户id
	//创建的时间
	CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at,omitempty"` // 关键：显式开启自动创建时间
}

// 电影简介
type MovieSynopsis struct {
	MovieId  uint   `gorm:"primarykey" json:"movie_id,omitempty" binding:"required"` //电影id
	Synopsis string `json:"synopsis,omitempty" binding:"required"`
}

// 电影相关的内容(AI将基于此回答用户提出的问题，以及与用户聊天)
type MovieContent struct {
	ID uint `gorm:"primarykey" json:"id,omitempty" binding:"required"`

	//外键
	MovieId uint `gorm:"not null" json:"movie_id,omitempty" binding:"required"` //电影id
	//该条内容在电影中所处的段落
	LocatedParagraph string `json:"located_paragraph,omitempty" binding:"required"`
	//内容正文
	Content string `json:"content,omitempty" binding:"required"`

	//用户观看电影  该分段  时，向AI提问的问题中，拆解出来的关键字--多对多
	MovieQuestionKeywordList []MovieQuestionKeyword `gorm:"many2many:movie_content_question_keyword_correlations" json:"movie_question_keyword_list,omitempty"`

	//AI使用该分段中被提问的关键字全网搜索之后，总结的结果（基于关键字形成的摘要）--一对多关系(因为一个关键字可能在多个电影中被问到，同一部电影的不同分段也可能被用户重复问到)
	SummaryList []MovieQuestionKeywordSummary `gorm:"foreignKey:MovieContentId" json:"summary_list,omitempty"`
}

// 用户观看电影时，向AI提问的问题中，拆解出来的关键字
type MovieQuestionKeyword struct {
	ID        uint      `gorm:"primarykey" json:"id,omitempty"`
	Keyword   string    `gorm:"unique;not null" json:"keyword,omitempty" binding:"required"`
	Count     uint64    `gorm:"default=0" json:"count"`
	CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at,omitempty"`

	//关键字所属哪些电影--多对多关系
	MovieList []Movie `gorm:"many2many:movie_question_keyword_correlations" json:"movie_list,omitempty"`
	//关键字所属哪些电影的哪些分段内容--多对多关系
	MovieContentList []MovieContent `gorm:"many2many:movie_content_question_keyword_correlations" json:"movie_content_list,omitempty"`
	//关键字的类别--多对多关系
	CategoryList []MovieQuestionKeywordCategory `gorm:"many2many:movie_question_keyword_category_correlations" json:"category_list,omitempty"`

	//AI使用该关键字全网搜索之后，总结的结果（基于关键字形成的摘要）--一对多关系(因为一个关键字可能在多个电影中被问到，同一部电影的不同分段也可能被用户重复问到)
	SummaryList []MovieQuestionKeywordSummary `gorm:"foreignKey:MovieQuestionKeywordId" json:"summary_list,omitempty"`
}

// 用户观看电影时，向AI提问的问题中，拆解出来的关键字所属的类别
type MovieQuestionKeywordCategory struct {
	ID           uint                   `gorm:"primarykey" json:"id,omitempty" binding:"required"`
	CategoryName string                 `gorm:"unique;not null" json:"category_name,omitempty" binding:"required"`
	KeywordList  []MovieQuestionKeyword `gorm:"many2many:movie_question_keyword_category_correlations" json:"keyword_list,omitempty"`
}

// AI使用该关键字全网搜索之后，总结的结果（基于关键字形成的摘要）
type MovieQuestionKeywordSummary struct {
	ID uint `gorm:"primarykey" json:"id,omitempty"`
	//关键字所形成的摘要
	Summary string `gorm:"not null" json:"summary,omitempty" binding:"required"`

	//外键关联(一对多)--描述：摘要是基于哪个关键字形成的
	MovieQuestionKeywordId uint `gorm:"not null" json:"movie_question_keyword_id,omitempty" binding:"required"`
	//外键关联(一对多)--描述：摘要是对哪部电影的哪个分段形成的
	MovieContentId uint `gorm:"not null" json:"movie_content_id,omitempty" binding:"required"`
}

// 关键字和电影之间的关联表
type MovieQuestionKeywordCorrelation struct {
	MovieId   uint `gorm:"primarykey;column:movie_id" json:"movie_id"`
	KeywordId uint `gorm:"primarykey;column:movie_question_keyword_id" json:"keyword_id"`
}

// 插入电影内容分段关联表
type MovieContentQuestionKeywordCorrelation struct {
	MovieContentId uint `gorm:"primaryKey;column:movie_content_id" json:"movie_content_id"`
	KeywordId      uint `gorm:"primaryKey;column:movie_question_keyword_id" json:"keyword_id"`
}

// 插入关键字与关键字所属类别关联关联表
type MovieQuestionKeywordCategoryCorrelation struct {
	CategoryId uint `gorm:"primaryKey;column:movie_question_keyword_category_id" json:"CategoryId"`
	KeywordId  uint `gorm:"primaryKey;column:movie_question_keyword_id" json:"keyword_id"`
}
